#include "widget.h"
#include "ui_widget.h"
#include "gamerole.h"
#include "setback.h"
#include "award.h"
#include <QObject>
#include <QPushButton>
#include <QSize>
#include <QLabel>
#include <QUrl>
#include <QMediaPlaylist>//管理媒体内容的官方列表
#include <QTransform>//对图形元素进行位置、大小和方向的调整
#include <QTime>//对时钟时间进行处理
#include <QtGlobal>//定义了 Qt 库里的众多全局定义、宏和类型
#include <QMessageBox>//消息对话框

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //将视图的基类设置为窗口
    mGameview.setParent(this);

    // 禁用滚动条
    mGameview.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    mGameview.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    // 调整视图大小与场景一致
    mGameview.setFixedSize(1280, 718);

    //设定视图和场景
    mGameview.setSceneRect(QRect(0,0,1280,718));
    mStartScene.setSceneRect(QRect(0,0,1280,718));

    // 创建并设置媒体播放器
    mStartMediaBG = new QMediaPlayer(this);
    mStartMediaBG1 = new QMediaPlayer(this);

    mStartMediaBG1->setMedia(QUrl("qrc:/music/跑酷游戏/音乐/我是奶龙，我才是奶龙_爱给网_aigei_com.mp3"));
    mStartMediaBG->setMedia(QUrl("qrc:/music/跑酷游戏/音乐/春日活力 轻松俏皮_爱给网_aigei_com.mp3"));
    mStartMediaBG->setVolume(50);
    mStartMediaBG1->setVolume(50);

    //音乐循环播放间隔时间计时器
    BGPlayTimer = new QTimer;
    QObject::connect(BGPlayTimer,&QTimer::timeout,[this](){
        mStartMediaBG->play();
        mStartMediaBG1->play();
        BGPlayTimer->stop();
    });

    //设置全程音乐的循环播放
    QObject::connect(mStartMediaBG, &QMediaPlayer::mediaStatusChanged, [=](QMediaPlayer::MediaStatus status) {
            if (status == QMediaPlayer::EndOfMedia) {
                // 当音乐播放结束时，重新开始播放
                BGPlayTimer->start(5000);
            }
        });

    QObject::connect(mStartMediaBG1, &QMediaPlayer::mediaStatusChanged, [=](QMediaPlayer::MediaStatus status) {
            if (status == QMediaPlayer::EndOfMedia) {
                // 当音乐播放结束时，重新开始播放
                BGPlayTimer->start(50000);
            }
        });

    //设置游戏结束的音乐播放
    mGameoverMediaBG = new QMediaPlayer;
    mGameoverMediaBG->setMedia(QUrl("qrc:/music/跑酷游戏/图片/游戏失败音效_爱给网_aigei_com.mp3"));
    mGameoverMediaBG->setVolume(50);

    //设置背景图的移动 使背景图处在移动的状态中，而使人物处在移动的假象中
    mBGmoveTimer = new QTimer;
    QObject::connect(mBGmoveTimer,&QTimer::timeout,this,&Widget::BGmove);//每100ms背景图移动一次

    //设置人物移动的计时器操作人物移动
    mRoleMoveTimer = new QTimer;
    mRoleMoveTimer->start(100);
    QObject::connect(mRoleMoveTimer,&QTimer::timeout,this,&Widget::mRoleMove);

    //设置人物跳跃计时器
    jumpTimer = new QTimer;
    jumpTimer->setInterval(100);
    QObject::connect(jumpTimer,&QTimer::timeout,this,&Widget::roleJump);

    //设置人物下蹲计时器
//    crouchTimer = new QTimer;
//    crouchTimer->setInterval(100);
//    QObject::connect(crouchTimer,&QTimer::timeout,this,&Widget::roleCrouch);

    //设置障碍物生成计时器
    setBackCreateTimer = new QTimer;
    QObject::connect(setBackCreateTimer,&QTimer::timeout,this,&Widget::setBackCreate);

    //设置障碍物移动计时器
    setBackMoveTimer = new QTimer;
    QObject::connect(setBackMoveTimer,&QTimer::timeout,[this](){
        for(auto setback:setBackList)
        {
            setback->setBackMove(QPoint(-5,0));
        }

        //执行碰撞检测
        checkCollisions();

        qDebug()<<"生成的障碍物数量："<<setBackList.size();
    });


    //设置障碍物生成冷却计时器
    setBackCreateCoolDownTimer = new QTimer;
    QObject::connect(setBackCreateTimer,&QTimer::timeout,[this](){
        canCreateSetBack = true;
    });
    
    //设置奖励生成计时器
    awardCreateTimer = new QTimer;
    QObject::connect(awardCreateTimer,&QTimer::timeout,this,&Widget::awardCreate);

    //设置奖励移动计时器
    awardMoveTimer = new QTimer;
    QObject::connect(awardMoveTimer,&QTimer::timeout,this,[this](){
        for(auto awd:awardList)
        {
            awd->awardMove(QPoint(-1,0));
        }
    });
    //设置奖励生成冷却计时器
    awardCreateCoolDownTimer = new QTimer;
    QObject::connect(awardCreateCoolDownTimer,&QTimer::timeout,[this](){
        canCreateAward = true;
    });

    //进行游戏开始场景的加载
    LoadStartScene();
}

Widget::~Widget()
{
    delete ui;
}
//设置游戏开始界面
void Widget::LoadStartScene()
{
    //固定窗口的大小（游戏开始及设置、说明界面）
     this->resize(1280,718);
    //设定游戏背景图，并完成元素——>场景——>视图——>窗口
    mStartBackGround.setPixmap(QPixmap(":/Icon/跑酷游戏/图片/startscene2.jpg"));
    mStartScene.addItem(&mStartBackGround);//背景元素添加到场景中

    //设定游戏名字
    QPixmap pixmap(":/Icon/跑酷游戏/图片/Line.png");
    mStartLine.setPixmap(pixmap);
    mStartLine.setPos(310,-25);
    mStartScene.addItem(&mStartLine);

    LineLabel = new QLabel;
    LineLabel->setText("跑酷");
    LineLabel->setFont(QFont("方正舒体",120,7,false));
    LineLabel->setStyleSheet("QLabel{color:#F15C21;background-color:transparent;}");
    LineLabel->resize(500,180);
    LineLabel->move(900,70);

    //将label添加到开始游戏的场景中
    mStartScene.addWidget(LineLabel);


    //设定开始游戏场景的人物
    mStartBGrole.setPixmap(QPixmap(":/Icon/跑酷游戏/图片/startrole.png"));
    mStartBGrole.setPos(50,180);
    mStartScene.addItem(&mStartBGrole);

    mGameview.setScene(&mStartScene);
    mGameview.update();
    mGameview.show();

   //设定开始游戏按钮
    startBtn=new QPushButton;
    startBtn->setText("开始游戏");//设置文本
    startBtn->setFont(QFont("华文琥珀",26,5,false));//设置字体、字体大小、加粗效果、是否倾斜
    startBtn->setStyleSheet("QPushButton{color:black;background-color:#CD853F;}");//设置背景为透明，字体为棕色
    startBtn->resize(275,75);//设置大小
    startBtn->move(750,400);
    mStartScene.addWidget(startBtn);

    //设置游戏说明按钮
    gameInterpretBtn=new QPushButton;
    gameInterpretBtn->setText("游戏说明");//设置文本
    gameInterpretBtn->setFont(QFont("华文琥珀",26,5,false));//设置字体、字体大小、加粗效果、是否倾斜
    gameInterpretBtn->setStyleSheet("QPushButton{color:black;background-color:#CD853F;}");//设置背景为透明，字体为棕色
    gameInterpretBtn->resize(275,75);//设置大小
    gameInterpretBtn->move(750,500);
    mStartScene.addWidget(gameInterpretBtn);

    //设置游戏设置按钮
    installBtn=new QPushButton;
    installBtn->setText("游戏设置");//设置文本
    installBtn->setFont(QFont("华文琥珀",26,5,false));//设置字体、字体大小、加粗效果、是否倾斜
    installBtn->setStyleSheet("QPushButton{color:black;background-color:#CD853F;}");//设置背景为透明，字体为棕色
    installBtn->resize(275,75);//设置大小
    installBtn->move(750,600);
    mStartScene.addWidget(installBtn);

    //点击游戏说明按钮跳转到游戏说明场景（规则、玩法）
    QObject::connect(gameInterpretBtn,&QPushButton::clicked,[this](){
        LoadInterpretScene();
    });

    //点击游戏设置按钮跳转到游戏设置场景
    QObject::connect(installBtn,&QPushButton::clicked,[this](){
        LoadInstallScene();
    });

    //点击游戏开始按钮跳转到游戏场景
    QObject::connect(startBtn,&QPushButton::clicked,[this](){
        LoadGameScene();
    });

}

//设置游戏说明界面
void Widget::LoadInterpretScene()
{
    //将游戏说明场景赋给视图
    mGameview.setScene(&mGameInterpretScene);
    mGameview.update();
    mGameview.show();

    //设置游戏说明背景图片
    mGameInterpretBackGround.setPixmap(QPixmap(":/Icon/跑酷游戏/图片/startscene2.jpg"));
    mGameInterpretScene.addItem(&mGameInterpretBackGround);

    //设置游戏说明中的游戏规则
    gameInterpret1 = new QLabel("游戏操作说明： ");
    gameInterpret1->setStyleSheet("color:black;background:transparent;");//设置背景颜色
    gameInterpret1->setFont(QFont("华文琥珀", 35,10));
    gameInterpret1->resize(400,100);
    gameInterpret1->move(100,125);
    gameInterpret1->show();
    mGameInterpretScene.addWidget(gameInterpret1);

    gameInterpret2 = new QLabel;
    gameInterpret2->setText("1.使用键盘和鼠标控制游戏人物的移动：A键控制人物左移、D键控\n制人物右移，点击鼠标右键控制人物跃起。\n"
                            "2.本游戏采用积分制，玩家控制游戏人物每吞吃掉一个硬币积两分，\n每收集一个道具积五分。\n"
                            "3.玩家获得道具会有额外的能力，如加速、免疫伤害等。\n"
                            "4.当玩家控制的角色撞击到障碍物或者掉入沟壑后，游戏结束，显示\n玩家的最后得分。玩家可选择重新开始游戏或者退出。\n");
    gameInterpret2->setStyleSheet("color: Black; background: transparent;");//设置背景颜色
    gameInterpret2->setFont(QFont("华文琥珀", 25,10));
    gameInterpret2->resize(1100,400);
    gameInterpret2->move(140,200);
    gameInterpret2->show();
    mGameInterpretScene.addWidget(gameInterpret2);

    //设置返回游戏开始场景的按钮
    backBtn = new QPushButton;
    backBtn->setText("返回");
    backBtn->setFont(QFont("华文琥珀",26,5,false));//设置字体、字体大小、加粗效果、是否倾斜
    backBtn->setStyleSheet("QPushButton{color:black;background-color:#CD853F;}");//设置背景为透明，字体为棕色
    backBtn->resize(275,75);//设置大小
    backBtn->move(900,25);
    mGameInterpretScene.addWidget(backBtn);
    QObject::connect(backBtn,&QPushButton::clicked,[this](){
        LoadStartScene();
    });

}

//设置游戏设置界面
void Widget::LoadInstallScene()
{
    //将游戏说明场景赋给视图
    mGameview.setScene(&mGameInstallScene);
    mGameview.update();
    mGameview.show();

    //为游戏设置附图片
    mGameInstallBackground.setPixmap(QPixmap(":/Icon/跑酷游戏/图片/startscene2.jpg"));
    mGameInstallScene.addItem(&mGameInstallBackground);

    //设置返回游戏开始场景的按钮
    backBtn1 = new QPushButton;
    backBtn1->setText("返回");
    backBtn1->setFont(QFont("华文琥珀",26,5,false));//设置字体、字体大小、加粗效果、是否倾斜
    backBtn1->setStyleSheet("QPushButton{color:black;background-color:#CD853F;}");//设置背景为透明，字体为棕色
    backBtn1->resize(275,75);//设置大小
    backBtn1->move(950,25);
    mGameInstallScene.addWidget(backBtn1);
    QObject::connect(backBtn1,&QPushButton::clicked,[=](){
        LoadStartScene();
    });


    //设置音乐播放的设置标签说明
    musicLabel = new QLabel;
    musicLabel->setText("音乐设置:");
    musicLabel->move(130,320);
    musicLabel->resize(190,75);
    musicLabel->setStyleSheet("QLabel{color:black;background-color:transparent;}");
    musicLabel->setFont(QFont("华文琥珀",28,5,false));
    mGameInstallScene.addWidget(musicLabel);//添加到游戏设置场景中

    //设置控制音乐播放的按钮
    musicStartBtn = new QPushButton;
    musicStartBtn->setText("播放音乐");
    musicStartBtn->setFont(QFont("华文琥珀",26,5,false));
    musicStartBtn->setStyleSheet("QPushButton{color:black;background-color:#CD853F;}");
    musicStartBtn->resize(275,75);
    musicStartBtn->move(350,290);
    musicStartBtn->show();
    mGameInstallScene.addWidget(musicStartBtn);//添加到游戏设置场景中

    //设置停止播放音乐的按钮
    musicEndBtn = new QPushButton;
    musicEndBtn->setText("停止播放");
    musicEndBtn->setFont(QFont("华文琥珀",26,5,false));
    musicEndBtn->setStyleSheet("QPushButton{color:black;background-color:#CD853F;}");
    musicEndBtn->resize(275,75);
    musicEndBtn->move(350,390);
    musicEndBtn->show();
    mGameInstallScene.addWidget(musicEndBtn);//添加到游戏设置场景中


    //点击开始播放按钮，播放背景音乐
    QObject::connect(musicStartBtn,&QPushButton::clicked,[this](){
        mStartMediaBG1->play();
        mStartMediaBG->play();
    });

    //点击停止播放按钮，停止播放音乐
    QObject::connect(musicEndBtn,&QPushButton::clicked,[this](){
       mStartMediaBG1->stop();
       mStartMediaBG->stop();
    });

    //设置音乐音量调节的滑动条
    musicSlider = new QSlider(Qt::Horizontal);
    musicSlider->setRange(0, 100); // 设置滑动条范围为 0 到 100
    musicSlider->move(370,550);

    //设置显示所调节音量的滑动条
    valueLabel = new QLabel;
    valueLabel->setText("当前音量：");
    valueLabel->move(130,520);
    valueLabel->resize(190,75);
    valueLabel->setStyleSheet("QLabel{color:black;background-color:transparent;}");
    valueLabel->setFont(QFont("华文琥珀",28,5,false));

    // 连接滑动条的 valueChanged 信号到槽函数
    QObject::connect(musicSlider, &QSlider::valueChanged,this, &Widget::MusicVolumeSet);

    mGameInstallScene.addWidget(valueLabel);//添加到游戏设置场景中
    mGameInstallScene.addWidget(musicSlider);

}

//设置游戏运行界面
void Widget::LoadGameScene()
{
    //重新设置窗口的大小
    this->resize(1280,510);

    //将游戏场景赋给视图
    mGameview.setScene(&mGameScene);
    mGameview.update();
    mGameview.show();

    //为背景图片设置位置，并且给与资源路径
    QPixmap gameScenePixmap(":/Icon/跑酷游戏/图片/Game1.jpg");
    QPixmap _gameScenePixmap=gameScenePixmap.scaled(1280,510);//重新设置照片的大小

    mGameBackGround1.setPixmap(_gameScenePixmap);//将照片传给背景图
    mGameBackGround2.setPixmap(_gameScenePixmap);

    mGameBackGround1.setPos(0,0);
    mGameBackGround2.setPos(1280,0);//设置背景图位置
    mGameScene.addItem(&mGameBackGround2);
    mGameScene.addItem(&mGameBackGround1);

    //加载游戏人物
    updateRole();
    loadGameRole();

    //障碍物产生和移动计时器的开启
    setBackCreateTimer->start(3000);
    setBackMoveTimer->start(70);
    
    //奖励产生和移动的计时器的开启
    awardCreateTimer->start(3000);
    awardMoveTimer->start(70);

    //设置游戏人物生命值的显示
    roleLifeDisplay = new QLabel;
    roleLifeDisplay->setText("生命值： " + QString::number(mRole.mRoleLife));
    roleLifeDisplay->setFont(QFont("华文琥珀",22,5,false));//设置字体、字体大小、加粗效果、是否倾斜
    roleLifeDisplay->setStyleSheet("QLabel{color:black;background-color:transparent;}");//设置背景为透明，字体为棕色
    roleLifeDisplay->resize(275,75);//设置大小
    roleLifeDisplay->move(50,8);
    mGameScene.addWidget(roleLifeDisplay);
    roleLifeDisplay->show();

    //设置返回游戏开始场景的按钮
    backBtn2 = new QPushButton;
    backBtn2->setText("返回");
    backBtn2->setFont(QFont("华文琥珀",26,5,false));//设置字体、字体大小、加粗效果、是否倾斜
    backBtn2->setStyleSheet("QPushButton{color:black;background-color:transparent;}");//设置背景为透明，字体为棕色
    backBtn2->resize(275,75);//设置大小
    backBtn2->move(1050,12);
    mGameScene.addWidget(backBtn2);
    backBtn2->show();
    QObject::connect(backBtn2,&QPushButton::clicked,[this](){
        LoadStartScene();
    });

}

//判断人物是否在地面上
bool Widget::isGround()
{
    return (mRole.y() >= 207);
}

//判断人物是否在下蹲状态
//bool Widget::isCrouch(){
//    return (mRole.y() >= 212);
//}

//更新游戏角色
void Widget::updateRole()
{
    //设定游戏人物形象
    if(isGround())
    {
        QPixmap _rolePixmap2(rolePixmap[0]);//人物正常行走时的形象
        QPixmap rolePixmap2 = _rolePixmap2.scaled(100,108);  //重新设定游戏人物的大小
        mRole.setPixmap(rolePixmap2);//为游戏人物设置图片
    }
    else if(!isGround())
    {
        QPixmap _rolePixmap3(rolePixmap[1]);//人物跳跃时的形象
        QPixmap rolePixmap3=_rolePixmap3.scaled(90,120); //重新设定游戏人物的大小
        mRole.setPixmap(rolePixmap3);//为游戏人物设置图片
    }
//    else{
//        QPixmap _rolePixmap1(rolePixmap[2]);//人物下蹲时的形象
//        QPixmap rolePixmap1=_rolePixmap1.scaled(70,69); //重新设定游戏人物的大小
//        mRole.setPixmap(rolePixmap1);//为游戏人物设置图片
//    }
}

//加载游戏角色
void Widget::loadGameRole()
{
    mRole.setPos(210,210);
    updateRole();

    //将游戏人物镜像翻转
    QTransform transform;
    transform.scale(-1, 1); // 水平方向缩放因子为 -1 实现水平翻转，垂直方向缩放因子为 1 保持不变
    mRole.setTransform(transform);

    //将游戏人物传给游戏场景
    mGameScene.addItem(&mRole);

    //进行游戏场景的更新
    mGameScene.update();
}

//设置滑动条控制音量
void Widget::MusicVolumeSet(int value)
{
    mStartMediaBG->setVolume(value);
    mStartMediaBG1->setVolume(value);
}

//设置游戏界面背景图移动函数
void Widget::BGmove()
{
    mGameBackGround1.moveBy(-20,0);
    mGameBackGround2.moveBy(-20,0);

    if(mGameBackGround1.x() + 1280 <= 0)
    {
        mGameBackGround1.setX(1280);
    }
    else if(mGameBackGround2.x() + 1280 <= 0)
    {
        mGameBackGround2.setX(1280);
    }

    mGameview.update();
}

//设置键盘事件
void Widget::keyPressEvent(QKeyEvent* event)
{
    switch(event->key())
    {
        case Qt::Key_D:
        {
           mKeyList.append(event->key());
           break;
        }
        case Qt::Key_Space:
        {
           if(isGround()) //&& !isCrouching)
           {
             LeapSpeed = -22;
             isJumping = true;
             jumpTimer->start();
           }
           break;
        }
//        case Qt::Key_S:
//        {
//           if(isGround() && !isJumping)
//           {
//             crouchSpeed = 5;
//             isCrouching = true;
//             crouchTimer->start();
//           }
//           break;
//        }
    }
}

void Widget::keyReleaseEvent(QKeyEvent *event)
{
    if(mKeyList.contains(event->key()))
    {
        mKeyList.removeOne(event->key());
    }
}

//设置人物移动函数
void Widget::mRoleMove()
{
    for(int keyCode:mKeyList)
    {
        switch(keyCode)
        {
        case Qt::Key_D:
        {
            Widget::mBGmoveTimer->start(100);
            mRole.moveBy(0.5,0);
            break;
        }
    }
    //边界的设置：倘若人物碰到边界，则返回，使人物不出界
    if(mRole.x()<0)
    {
        mRole.setX(0);
    }
    else if(mRole.x()>1280)
    {
        mRole.setX(1280);
    }
    else if(mRole.y()<0)
    {
        mRole.setY(0);
    }
    else if(mRole.y()>300)
    {
        mRole.setY(300);
    }
}
    mGameScene.update();
}

//跳跃函数
void Widget::roleJump()
{
    if(isJumping)
    {
       LeapSpeed += leapGravity;
       mRole.setY(mRole.y() + LeapSpeed);
       if(isGround())
       {
           LeapSpeed = -22;
           isJumping = false;
           jumpTimer->stop();
       }
    }
    updateRole();
    mGameScene.update();
}

//设置人物下蹲函数
//void Widget::roleCrouch(){
//    if(isCrouching)
//    {
//       crouchSpeed -= crouchGravity;
//       mRole.setY(mRole.y() + crouchSpeed);
//       if(isGround())
//       {
//           crouchSpeed = 5;
//           isCrouching = false;
//           crouchTimer->stop();
//       }
//    }
//    updateRole();
//    mGameScene.update();
//}

//设置障碍物生成函数
void Widget::setBackCreate()
{

    if(!canCreateSetBack)
    {
        return;
    }
    // 初始化种子（只需一次）
    qsrand(QTime::currentTime().msec());

    // 生成随机数
    int randomType = qrand() % 3; // 0~2

    //根据随机类型创建障碍物
    setBack* newSetBack = nullptr;

    //不同的随机数对应不同的障碍物
    switch(randomType)
    {
       case 0://类型一 子弹
       {
          QPixmap setBackPixmap1(":/Icon/跑酷游戏/图片/enemy2.png");
          QPoint setBackPos1(QPoint(1300,250));
          newSetBack = new setBack(setBackPos1,setBackPixmap1,setBack::SB_bullet);
          break;
       }
       case 1://类型二 平台
       {
          QPixmap setBackPixmap2(":/Icon/跑酷游戏/图片/platform.png");
          QPoint setBackPos2(QPoint(1300,240));
          newSetBack = new setBack(setBackPos2,setBackPixmap2,setBack::SB_platform);
          break;
       }
       case 2://类型三 栅栏
       {
          QPixmap _setBackPixmap3(":/Icon/跑酷游戏/游戏道具免抠png图片 (312)_爱给网_aigei_com.png");
          QPixmap setBackPixmap3 = _setBackPixmap3.scaled(100,100);
          QPoint setBackPos3(QPoint(1300,240));
          newSetBack = new setBack(setBackPos3,setBackPixmap3,setBack::SB_fence);
          break;
       }
    }

    qDebug()<<"生成障碍物类型："<<randomType;

    //将随机到的障碍物种类传给链表，并且添加到场景中
    if(newSetBack)
    {
        mGameScene.addItem(newSetBack);
        setBackList.append(newSetBack);
    }

    //更新游戏进行场景
    mGameScene.update();

    //开始障碍物生成冷却计时器 且 不可产生障碍物
    canCreateSetBack = false;
    setBackCreateCoolDownTimer->start(2500);
}

//设置碰撞检测函数
void Widget::checkCollisions()
{
    qDebug()<<"进行了碰撞检测";

    for (auto it = setBackList.begin(); it != setBackList.end();)
    {
           setBack* setback = *it;
           if (mRole.collidesWithItem(setback))
           {
               qDebug() << "碰撞到障碍物，类型：" << setback->getSetbackType();
               handleCollisions(setback);

               // 从列表和场景中彻底删除障碍物
               mGameScene.removeItem(setback);
               delete setback;
               it = setBackList.erase(it); // 关键修复：更新迭代器
           }
           else
           {
               ++it;
           }
       }
}

//设置碰撞解决函数
void Widget::handleCollisions(setBack* setback)
{
    qDebug()<<"进行了碰撞处理";

    //进行碰撞音效的播放
    mRoleCollisionMedia = new QMediaPlayer;
    mRoleCollisionMedia->setMedia(QUrl("qrc:/music/跑酷游戏/图片/木头撞击 基本木头撞击01_爱给网_aigei_com.mp3"));
    mRoleCollisionMedia->setVolume(50);
    mRoleCollisionMedia->play();

    setBack::setbackType type = setback->getSetbackType();

    //进行生命值的减少
    switch(type)
    {
       case setBack::setbackType::SB_bullet:
       {
          mRole.mRoleLife -= 1;
          break;
       }
       case setBack::setbackType::SB_platform:
       {
          mRole.mRoleLife -= 2;
          break;
       }
       case setBack::setbackType::SB_fence:
       {
          mRole.mRoleLife -= 3;
          break;
       }
    }

    //更新显示游戏人物的生命值
    qDebug() << "生命值减少后：" << mRole.mRoleLife; // 调试输出
    roleLifeDisplay->setText("生命值：" + QString::number(mRole.mRoleLife));


    // 强制刷新 UI
    roleLifeDisplay->repaint();
    qApp->processEvents();

    //当游戏人物生命值清零时，调游戏结束函数
    if(mRole.mRoleLife <= 0)
    {
        qDebug()<<"人物生命值清零，游戏结束！";
        isGameover = true;
        gameOver();
    }

    //更新界面
    mGameScene.update();
}

//设置游戏结束函数  (需要改正）
void Widget::gameOver()
{
    //设置游戏结束的背景音乐
    if(isGameover)
    {
        qDebug()<<"播放游戏结束时的背景音乐";
        mGameoverMediaBG->play();
    }
    //设置弹出消息框
    auto btn = QMessageBox::question(this,"警告","游戏失败，是否再来一局？",QMessageBox::Yes|QMessageBox::No);
    if(btn == QMessageBox::Yes)
    {
        qDebug()<<"再来一局";
        LoadGameScene();
    }
    else if(btn == QMessageBox::No)
    {
        qDebug()<<"退出游戏界面";
        LoadStartScene();
    }
}

//设置奖励生成
void Widget::awardCreate()
{
    if(!canCreateAward)
    {
        return;
    }
    // 初始化种子（只需一次）
    qsrand(QTime::currentTime().msec());

    // 生成随机数
    int randomAwardType = qrand() % 3; // 0~2

    //根据随机类型创建奖励
    award* newAward = nullptr;

    //不同的随机数对应不同的奖励类型
    switch(randomAwardType)
    {
       case 0://类型一 普通奖励
       {
          QPixmap _awardPixmap1(":/Icon/跑酷游戏/图片/award.png");
          QPixmap awardPixmap1 = _awardPixmap1.scaled(50,49);
          QPoint awardPps1(QPoint(1300,250));
          newAward = new award(awardPixmap1,awardPps1,award::AD_simpleAward);
          break;
       }
       case 1://类型二 超级奖励
       {
          QPixmap _awardPixmap2(":/Icon/跑酷游戏/图片/great_award.png");
          QPixmap awardPixmap2 = _awardPixmap2.scaled(50,41);
          QPoint awardPos2(QPoint(1300,240));
          newAward = new award(awardPixmap2,awardPos2,award::AD_superAward);
          break;
       }
    }

    qDebug()<<"生成奖励类型："<<randomAwardType;

    //将随机到的奖励种类传给链表，并且添加到场景中
    if(newAward)
    {
        mGameScene.addItem(newAward);
        awardList.append(newAward);
    }

    //更新游戏进行场景
    mGameScene.update();

    //开始奖励生成冷却计时器 且 不可产生奖励
    canCreateAward = false;
    awardCreateCoolDownTimer->start(2500);
}
